<?php

namespace app\common\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\Exception;

class Farmremind extends Command
{

    protected function configure(){
        $this->setName('cron')->setDescription("农事提醒计划任务 Crontab");
    }

    protected function execute(Input $input, Output $output){
        // 农事提醒
        //$this->farmremind();
        self::cron();
    }

    /**
     * 农事提醒
     */
    public static function cron(){
        //trace('农事提醒同步开始','info');

        try {
            $model = new \app\admin\model\Userfarmremind();
            $smsObj = new \app\lib\Sms();
            //$userModel = new \app\admin\model\User();

            $where = [];
            $join = [
                ['__USER__ u', 'u.id = a.userId'],
                ['__MEMBER__ m', 'm.id = u.memberId']
            ];
            $field = 'a.*, m.mobile';
            // 所有农事提醒
            $list = $model->alias('a')->where($where)->join($join)->field($field)->select();
            if($list){
                foreach ($list as $item) {
                    trace($item['id'] . '|' . date('Y-m-d H:i:s', $item['time']),'info');
                    // 上次提醒时间
                    if ($item['lastTime']){
                        $startTime = $item['lastTime'];
                    } else {
                        $startTime = $item['time'];
                    }
                    // 下次提醒时间
                    $per = $item['per']; // 每 X 天/周/月/年
                    switch ($item['repeat']) {
                        case 0:
                            // 提醒一次
                            $endTime = $startTime;
                            break;
                        case 1:
                            // 每天
                            $endTime = $startTime + ($per * 86400);
                            break;
                        case 2:
                            // 每周
                            $endTime = $startTime + ($per * 86400 * 7);
                            break;
                        case 3:
                            // 每月
                            $endTime = $startTime + ($per * 86400 * 30);
                            break;
                        case 4:
                            // 每年
                            $endTime = $startTime + ($per * 86400 * 365);
                            break;
                        default : break;
                    }

                    // 是否需要提醒
                    if(date('Y-m-d H', time()) === date('Y-m-d H', $endTime)){
                        if($item['mode'] == 2){
                            // 短信提醒
                            /*$phone = $userModel
                                ->alias('a')
                                ->where('a.id', $item['userId'])
                                ->join('__MEMBER__ m', 'a.memberId = m.id')
                                ->value('m.mobile');*/
                            $mobile = $item['mobile'];
                            if ($mobile) {
                                if ($item['repeat'] == 0) {
                                    if($item['frequency'] == 0){
                                        $smsRes = $smsObj->sendMess($mobile, "农事提醒 【智慧乡镇】");
                                    }
                                } else {
                                    $smsRes = $smsObj->sendMess($mobile, "农事提醒 【智慧乡镇】");
                                }

                                if (isset($smsRes)) {
                                    if ($smsRes['msg'] == 'ok') {
                                        // 提醒次数加1 & 更新最后一次提醒时间
                                        $data = [
                                            'frequency' => $item['frequency'] + 1,
                                            'lastTime' => $endTime
                                        ];
                                        $result = $model->where(['id' => $item['id']])->update($data);

                                        if($result !== false){
                                            trace('更新数据成功','log');
                                        }else{
                                            trace('更新数据失败','notice');
                                        }

                                        trace($mobile . ': 农事提醒短信发送成功','log');
                                    } else {
                                        trace($mobile . ': 农事提醒短信发送失败','notice');
                                    }
                                }
                            } else {
                                trace('没有手机号','notice');
                            }
                        }
                    }
                }
            }
        } catch (Exception $e) {
            trace($e->getMessage(),'error');
        }

        //trace('农事提醒同步结束','info');
    }

}